package com.yy.customgeneric;

import java.util.Arrays;

/**
 * chapter15  com.yy.customgeneric
 * 2023-06-22 22:58
 *
 * @author yy yuyue
 * description : 不可描述
 * @date 2023/6/22 22:58
 */
@SuppressWarnings({"all"})
public class CustomGeneric_ {
    public static void main(String[] args) {
        //T=Double，R=String，M=Integer
        Tiger<Double, String, Integer> g = new Tiger<>("john");
        g.setT(10.9); //0K
//        g.setT("yy"); //错误，类型不对
        System.out.println(g);
        Tiger g2 = new Tiger("john~~");//0K T=Object R=Object M=Object
        g2.setT("yy"); //0K,因为 T=Object "yy"=String 是object子类
        System.out.println("g2=" + g2);
    }
}

// 解读:
//1. Tiger 后面泛型，所以我们把 Tiger 就称为自定义泛型类
//2. T, R, M 泛型的标识符, 一般是单个大写字母
//3. 泛型标识符可以有多个
//4. 普通成员可以使用泛型(属性、方法)
//5. 使用泛型的设置, 不能初始化!
//6. 静态方法中不能使用类的泛型!
//泛型看的是编译类型
class Tiger<T, R, M> {
    String name;
    R r;//属性使用到泛型
    M m;

    T t;
    //因为设置在new 的时候, 不能确定T的类型, 就无法在内存开辟空间!
//    T[] ts = new T[8];
    T[] ts;
    //类型形参 'T' 不能直接实例化


    public Tiger(String name) {
        this.name = name;
    }

    public Tiger(R r, M m, T t) {//构造器使用泛型

        this.r = r;
        this.m = m;
        this.t = t;
    }


    //无法从 static 上下文引用 'com.yy.customgeneric.Tiger.this'
    //因为静态是和类相关的, 在类价值时, 对象还没有创建
    //所以, 如果静态方法和静态属性使用了泛型, JVM就无法完成初始化
//    static R r2;
//    public static void m1(M m){
//
//    }


    public Tiger(String name, R r, M m, T t) {//构造器使用泛型
        this.name = name;
        this.r = r;
        this.m = m;
        this.t = t;
    }
    //方法使用泛型

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public R getR() {//方法使用到泛型
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }

    public M getM() {
        return m;
    }

    public void setM(M m) {
        this.m = m;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public T[] getTs() {
        return ts;
    }

    public void setTs(T[] ts) {
        this.ts = ts;
    }

    @Override
    public String toString() {
        return "Tiger{" +
                "name='" + name + '\'' +
                ", r=" + r +
                ", m=" + m +
                ", t=" + t +
                ", ts=" + Arrays.toString(ts) +
                '}';
    }
}